// 给定一个字符串 s ，请你找出其中不含有重复字符的 最长 子串 的长度。

// 示例 1:

// 输入: s = "abcacbbb"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
// 示例 2:

// 输入: s = "bbbbb"
// 输出: 1
// 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
// 示例 3:

// 输入: s = "pwwkew"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
const isNoRepeat = function (s) {
  const map = new Map();
  for (let index = 0; index < s.length; index++) {
    const element = s[index];
    if (map.get(element)) return false;
    map.set(element, 1);
  }
  return true;
};
// 超出时间限制
var _lengthOfLongestSubstring = function (s) {
  let ans = 0;
  for (let left = 0; left < s.length; left++) {
    for (let right = s.length - 1; right >= left; right--) {
      const str = s.slice(left, right + 1);
      if (isNoRepeat(str)) {
        ans = Math.max(ans, right - left + 1);
        break;
      }
    }
  }
  return ans;
};

// 判断数组的最长连续的长度
var longestContinuous = function (arr) {
  let ans = 0;
  if (arr.length <= 1) return arr.length;
  let start = 0;
  for (let n = 1; n < arr.length; n++) {
    if (arr[n] - arr[n - 1] !== 1) {
      ans = Math.max(ans, n - start);
      start = n;
    }
  }
  if (start !== arr.length - 1) {
    ans = Math.max(ans, arr.length - start);
  }
  return ans;
};

// 滑动窗口 有点难理解
function lengthOfLongestSubstring(s) {
  const charIndexMap = {};
  let maxLength = 0;
  let left = 0;

  for (let right = 0; right < s.length; right++) {
    const currentChar = s[right];
    const _charIndex = charIndexMap[currentChar];
    if (_charIndex !== undefined && _charIndex >= left) {
      left = _charIndex + 1;
    }
    charIndexMap[currentChar] = right;
    maxLength = Math.max(maxLength, right - left + 1);
  }
  return maxLength;
}

const ans = lengthOfLongestSubstring("abcacbbb");
console.log("ans: ", ans);
